home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 037a / exec31.zip / LIESMICH.DOC < prev    next >
Text File  |  1991-08-20  |  18KB  |  410 lines

  1.  
  2.               Eine EXEC Funktion mit Speicherauslagerung
  3.                   Version 3.1, Freigegeben 91-08-20
  4.       
  5.                       Public Domain Software von
  6.                             Thomas Wagner
  7.                        Ferrari electronic GmbH
  8.  
  9.  
  10. Dieses Archiv enthält die Quellen für eine 'EXEC'-Funktion die den
  11. Aufruf externer Programme erlaubt, wobei der Programmspeicher
  12. optional auf EMS, XMS, oder Datei ausgelagert wird. Bei Auslagerung
  13. des Speichers werden nur noch wenige K des Hauptspeichers belegt
  14. während das externe Programm ausgeführt wird. Der Code/Daten-Bereich
  15. beträgt etwa 1k, der benötigte Speicherplatz ist abhängig von der
  16. Speicherfragmentierung, sowie besonders von der Größe des
  17. Umgebungsvariablenblocks. Üblicherweise werden zwischen 2K und 7K
  18. belegt.
  19.  
  20. Die Routinen sind kompatibel mit 
  21.    Turbo C (Versionen 1.x, 2.x, sowie C++ 1.0)
  22.    Borland C++ (Version 2.0),
  23.    Microsoft C (Versionen 5.1 und 6.0), 
  24.    Watcom C (Version 8.0), 
  25.    Turbo Pascal (Versionen 4.x und 5.x, Version 6.x nicht getestet). 
  26.  
  27. EMS (LIM 3.0 und spätere Versionen) oder XMS werden benutzt sofern
  28. ausreichend Platz zur Verfügung steht. Wenn nicht, wird eine
  29. temporäre Plattendatei angelegt. Diese Datei wird in dem durch die
  30. Umgebungsvariablen TEMP= oder TMP= gegebenen Pfad angelegt. Ist kein
  31. solcher Pfad angegeben, wird der aktuelle Pfad benutzt.
  32.  
  33. Aufruf und Parameterversorgung sind in der Datei "exec.h" (C) bzw.
  34. "exec.pas" (Pascal) detailliert dokumentiert.
  35.  
  36. Das allgemeine Format ist
  37.  
  38.    retcode = do_exec (Name des auszuführenden Programms,
  39.                       Programm-Parameter und Redirection String,
  40.                       Spawn-Optionen,
  41.                       Benötigter Speicher (0xffff lagert stets aus, 0 nie),
  42.                       Umgebungsvariablen-Zeiger/Flag)
  43.  
  44. zum Beispiel:
  45.  
  46.    rc = do_exec ("cl", "-c -Od exec.c >&errout", USE_ALL, 0xffff, NULL);
  47.  
  48. oder, für Pascal:
  49.  
  50.    rc := do_exec ('tpc', '/$D+ exec >&errout', USE_ALL, $ffff, false);
  51.  
  52. Redirection für Standard Input, Standard Output, und Standard Error
  53. wird optional behandelt indem der Parameter-String nach den folgenden
  54. Kombinationen durchsucht wird:
  55.  
  56.    stdin:   <file
  57.    stdout:  >file    oder >>file   zum Anfügen
  58.    stderr:  >&file   oder >&>file  zum Anfügen
  59.  
  60. Redirection wird standardmäßig unterstützt. Um sie auszuschalten,
  61. müssen Sie die Definitionen sowohl in spawn.asm als auch in
  62. exec.c/exec.pas ändern.
  63.  
  64. Wenn das auszuführende Kommando eine Batch-Datei ist, wird
  65. automatisch der Kommando-Prozessor aufgerufen. Der Kommandoprozessor
  66. wird auch aufgerufen wenn das Kommando leer ist. Dabei wird die
  67. COMSPEC-Umgebungsvariable benutzt um den Kommandoprozessor zu finden,
  68. zusätzliche Parameter in der COMSPEC-Zeile werden in die
  69. Kommandoparameter eingefügt.
  70.  
  71. Zum Beispiel:
  72.  
  73.    Es sei  COMSPEC=C:\DOS\COMMAND.COM /E:960
  74.            PATH=C:\DOS;C:\CMD
  75.            Datei B.BAT existiert in C:\CMD
  76.            do_exec wird aufgerufen mit ('b', 'eins zwei >out', ...)
  77.  
  78.    Dann ist das aufgerufene Kommando
  79.            C:\DOS\COMMAND.COM
  80.    mit dem Parameter-String
  81.            /E:720 /C C:\CMD\B.BAT eins zwei
  82.    und Standard Output wird umgeleitet auf die Datei 'out'.
  83.  
  84.  
  85.  
  86.                         INHALT
  87.                         ======
  88.  
  89. Dieses Archiv enthält die folgenden Dateien:
  90.  
  91.     LIESMICH.DOC    Diese Datei
  92.     README.DOC      Englische Version dieser Datei
  93.  
  94.     GETLANG.EXE     Ein Hilfsprogramm zur Extraktion einer ein-
  95.                     sprachigen Version aus der zweisprachigen
  96.                     Quelle.
  97.                     Alle C- und Assembler-Quellen (die Pascal-Quellen
  98.                     leider nur teilweise) sind sowohl in Deutsch als
  99.                     auch in Englisch dokumentiert, was die Quellen
  100.                     schwer lesbar macht. Für bessere Lesbarkeit
  101.                     können Sie mit GETLANG eine der Sprachen
  102.                     eliminieren.
  103.  
  104.          Benutzung:  GETLANG Sprache Compiler <Eingabe >Ausgabe
  105.             wobei    Sprache   'E' für Englisch oder 'D' für Deutsch
  106.                      Compiler  'C' für C Dateien, 'A' für Assembler,
  107.                                'P' für Pascal.
  108.  
  109.          Beispiele:  GETLANG d a <spawn.asm >spawnd.asm
  110.                      GETLANG d c <extest.c >extestd.c
  111.  
  112.     DEUTSCH.BAT     Batch-File zur Ausführung von GETLANG für alle
  113.                     Quelldateien, deutsche Version
  114.     ENGLISH.BAT     Batch-File zur Ausführung von GETLANG für alle
  115.                     Quelldateien, englische Version
  116.  
  117.     SPAWN.ASM       Die Hauptfunktion für exec.
  118.  
  119.         Diese Datei ist für die C und Pascal Versionen gleich.
  120.         Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler 
  121.         assembliert werden. Die C Version kann mit TASM (geben Sie
  122.         /JMASM51 an) oder MASM 5.1 übersetzt werden.
  123.  
  124.         Assemblieren mit:
  125.             tasm /DPASCAL spawn,spawnp;     Für Turbo Pascal, near calls
  126.             tasm /DPASCAL /DFARCALL spawn,spawnp;  
  127.                                             Für Turbo Pascal, far calls
  128.             ?asm spawn;                     Für C (Default small model)
  129.             ?asm /DMODL=xxx spawn;          For C (model 'xxx')
  130.          Beispiel:
  131.             masm /DMODL=large spawn;            Large model C
  132.             tasm /DMODL=medium /JMASM51 spawn;  Medium model C
  133.  
  134.     SPAWNP.OBJ      SPAWN assembliert für Pascal, near calls
  135.     SPAWNCS.OBJ     SPAWN assembliert für C (small model)
  136.     SPAWNCL.OBJ     SPAWN assembliert für C (large model)
  137.         
  138.         Die C Dateien wurden mit dem /MX-Schalter übersetzt um
  139.         Groß-/Kleinschreibung beim Linken zu berücksichtigen.
  140.  
  141.         Hinweis für Turbo Pascal: Sie können die "near call" Version
  142.         von SPAWN auch dann nutzen wenn Sie mit "force far calls"
  143.         kompilieren, indem Sie die "external"-Definitionen von
  144.         do_spawn und prep_swap in Datei exec.pas in {$F-} und {$F+} 
  145.         einschließen.
  146.         Um Konfusion bei der Verwendung mehrerer Compiler zu
  147.         vermeiden, wurde das Pascal-Object "spawnp.obj" benannt.
  148.  
  149.     CHECKPAT.ASM   Hilfsfunktion zur Prüfung und Auflösung eines Pfades
  150.  
  151.         Diese Datei ist für die C und Pascal Versionen gleich.
  152.         Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler 
  153.         assembliert werden. Die C Version kann mit TASM (geben Sie
  154.         /JMASM51 an) oder MASM 5.1 übersetzt werden.
  155.  
  156.         Assemblieren mit:
  157.             tasm /DPASCAL checkpat,checkpap;  Für Turbo Pascal, near calls
  158.             tasm /DPASCAL /DFARCALL checkpat,checkpap;  
  159.                                               Für Turbo Pascal, far calls
  160.             ?asm checkpat;                    Für C (Default small model)
  161.             ?asm /DMODL=xxx checkpat;         Für C (model 'xxx')
  162.          Beispiel:
  163.             masm /DMODL=large checkpat;            Large model C
  164.             tasm /DMODL=medium /JMASM51 checkpat;  Medium model C
  165.  
  166.     CHECKPAP.OBJ    CHECKPAT assembliert für Pascal, far calls
  167.     CHECKPCS.OBJ    CHECKPAT assembliert für C (small model)
  168.     CHECKPCL.OBJ    CHECKPAT assembliert für C (large model)
  169.     CHECKPAT.PAS    Einbindungs-Unit für checkpat (Nur Pascal)   
  170.  
  171.         Die C Dateien wurden mit dem /MX-Schalter übersetzt um
  172.         Groß-/Kleinschreibung beim Linken zu berücksichtigen.
  173.         Die Pascal-Version muß mit dem FARCALL-Schalter assembliert
  174.         werden wenn Sie sie mit der Einbindungs-Unit CHECKPAT.PAS
  175.         zusammen benutzen. Zumindest Turbo Pascal Version 5.5
  176.         verwendet offenbar stets einen Far Call wenn eine externe
  177.         Routine im Interface-Teil einer Unit definiert wird.
  178.  
  179.     EXEC.PAS        Interface Routinen und Dokumentation für Turbo Pascal
  180.     EXEC.C          Interface Routinen für C
  181.     EXEC.H          Interface Definitionen und Dokumentation für C
  182.     COMPAT.H        MS-C/TC Kompatibilitäts-Definitionen für C
  183.  
  184.         Diese Dateien bereiten die Parameter für die Hauptfunktion
  185.         vor und bearbeiten die Datei-Suche und Umgebungsvariablen.
  186.  
  187.     EXTEST.C        C Test-Programm für EXEC
  188.     EXTEST.PAS      Turbo Pascal Test-Programm für EXEC
  189.  
  190.         Das EXTEST Programm testet die Funktionalität der do_exec
  191.         Funktion. Es erwartet die Eingabe eines DOS-Kommandos und,
  192.         durch Komma getrennt, seiner Parameter. Die Eingabe einer
  193.         Leerzeile startet COMMAND.COM ohne Parameter.
  194.  
  195.    MAKEPAS          Make-Datei für Turbo Pascal (Borland Make) 
  196.    MAKETC           Make-Datei für Borland C++ (Borland Make) 
  197.    MAKEMS           Make-Datei für Microsoft C (MS NMAKE) 
  198.  
  199.  
  200. Die Turbo Pascal Version von EXEC.PAS enthält Ersatzfunktionen für
  201. die Umgebungsvariablen-Zugriffsfunktionen 'envcount', 'envstr', und
  202. 'getenv', sowie eine zusätzliche Funktion 'putenv'. Diese Funktion
  203. erlaubt Ihnen, zur Umgebung des gerufenen Programms Strings
  204. hinzuzufügen. Die Definition ist
  205.  
  206.         procedure putenv (envvar: string);
  207.  
  208. wobei 'envstr' einen String der Form 'ENVVAR=wert' enthält. Das '='
  209. ist notwendig. Um einen Umgebungsvariablenstring zu löschen geben Sie
  210. 'ENVVAR=' an. Bitte nutzen Sie nur die Funktionen aus der EXEC Unit,
  211. mischen Sie sie nicht mit Aufrufen der Funktionen der DOS Unit.
  212.  
  213.  
  214.                         SUPPORT
  215.                         =======
  216.  
  217. Diese Software ist "Public Domain", das heißt es gibt keinerlei
  218. Einschränkungen bezüglich ihrer Nutzung, ob privat oder in
  219. kommerziellen Produkten. Es ist weder eine Registrierungsgebühr zu
  220. zahlen, noch sind zur Nutzung irgendwelche Lizenzen erforderlich.
  221.  
  222. Dies heißt allerdings auch, daß der Autor zu keiner Leistung
  223. gegenüber dem Nutzer verpflichtet ist. Jegliche Ansprüche auf
  224. Schadenersatz bei Fehlfunktionen sind ausgeschlossen. Sie haben die
  225. Quellen, bitte prüfen Sie sie vor Nutzung.
  226.  
  227. Ich möchte auch um Verständnis bitten, daß ich nicht in der Lage bin,
  228. kostenlose Programmierberatung zu erteilen, Spezialversionen für
  229. exotische Compiler zu erstellen, oder neue Versionen dieses Programms
  230. kostenlos zu versenden. 
  231.  
  232. Fehlermeldungen, Verbesserungsvorschläge und ähnliches senden Sie
  233. bitte an meine Firmen-Adresse:
  234.  
  235.         Ferrari electronic GmbH
  236.         Thomas Wagner
  237.         Beusselstrasse 27
  238.         D-1000 Berlin 21
  239.  
  240.         Telephon: (030) 396 50 21 (nur im äußersten Notfall)
  241.         Fax:      (030) 396 80 20
  242.  
  243.         BIX:   twagner
  244.         UUCP:  oeschi@netmbx.UUCP (attn: Thomas Wagner)
  245.  
  246. Ein eingeschränkter Support ist über BIX, das Teleconferencing System
  247. von McGraw-Hill, möglich. Falls Sie Fragen oder Fehlermeldungen
  248. haben, senden sie BIXmail an 'twagner'. Details über BIX finden Sie
  249. in der Englischsprachigen Version dieser Dokumentation.
  250.  
  251.  
  252.  
  253.                         EINSCHRÄNKUNGEN
  254.                         ===============
  255.  
  256. Der "keine Rückkehr"-Modus von do_exec ist nur der Vollständigkeit
  257. halber verfügbar. Er hat einige Nachteile gegenüber den
  258. Standard-Funktionen der Compiler-Bibliotheken. Insbesondere werden
  259. offene Dateien nicht abgeschlossen, und durch die Laufzeitbibliothek
  260. belegte Interrupt-Vektoren werden nicht auf den DOS-Standardwert
  261. zurückgesetzt. Wenn möglich, benutzen Sie für diesen Modus die
  262. Standardfunktionen.
  263.  
  264. Das Assembler-Modul "spawn" darf nicht das erste Modul beim Linken
  265. sein. Fügen Sie es in eine Bibliothek ein, oder geben Sie spawn.obj
  266. als eine der letzten zu linkenden Dateien an. Das spawn-Modul
  267. überschreibt etwa 1k am Anfang des Programmspeichers. Dieser Speicher
  268. wird zwar gesichert, er darf aber nicht Teile des Moduls selbst
  269. enthalten, da der Programmcode dabei zerstört würde. Die
  270. do_exec-Funktion überprüft diese Bedingung, und kehrt mit einem
  271. entsprechenden Fehlercode zurück falls der Code in Gefahr wäre.
  272.  
  273. Bei Aufruf von do_exec dürfen keine Interrupt-Handler installiert
  274. sein. Dies schließt Handler für Control-C und Critical Errors ein.
  275. Sofern Sie Interrupts bearbeiten wollen während Ihr Programm
  276. ausgelagert ist, müssen Sie das spawn-Modul modifizieren, sodaß die
  277. Handler in den residenten Teil übernommen werden.
  278.  
  279. Offene Dateien bleiben während der do_exec-Funktion geöffnet. Dies
  280. reduziert die Zahl der möglichen offenen Dateien für das
  281. Kind-Programm. Die Umgebungsvariable "C_FILE_INFO", die von einigen
  282. C-Compilern bei Aufruf der Standard-Funktionen für spawn erzeugt
  283. wird, wird nicht unterstützt. Wenn NO_INHERIT in spawn.asm gesetzt
  284. ist (Standard), werden alle offenen Dateien außer den ersten fünf
  285. Standard-Dateien vor dem Kindprozess "versteckt" und damit nicht
  286. vererbt. Dies erlaubt dem Kindprozess, mehr Dateien zu öffnen, wobei
  287. allerdings das Systemweite Limit (FILES= in config.sys) hoch genug
  288. sein muß um alle offenen Dateien zu unterstützen.
  289.  
  290. Interne Kommandos (CD, DIR usw.) werden nicht automatisch bearbeitet.
  291. Sie können diese ausführen indem Sie den Kommandointerpreter laden
  292. (durch Übergabe eines leeren Strings für das auszuführende Programm).
  293. Zum Beispiel:
  294.  
  295. (C)     retcode = do_exec ("dir", "*.*", USE_ALL, 0xffff, environ);
  296.         if (retcode == RC_NOFILE)
  297.            retcode = do_exec ("", "/c dir *.*", USE_ALL, 0xffff, environ);
  298.  
  299. (P)     retcode := do_exec ('dir', '*.*', USE_ALL, $ffff, true);
  300.         if (retcode = RC_NOFILE)
  301.            retcode := do_exec ('', '/c dir *.*', USE_ALL, $ffff, true);
  302.  
  303.  
  304.  
  305.                         HINWEISE
  306.                         ========
  307.  
  308. Die Funktion sollte mit DOS bis herunter zu Version 2.11 kompatibel
  309. sein. Getestet wurde jedoch nur unter DOS 3.3, DOS 4.0, DOS 5.0, und
  310. DR-DOS 5.0.
  311.  
  312. Kompatibilität zu Compiler-Versionen wurde nur getestet mit Borland
  313. C++ 2.0, Microsoft C 6.0a, und Turbo Pascal 5.5. Auf andere Compiler
  314. habe ich leider keinen Zugriff.
  315.  
  316. Wird ein Kommando aufgerufen das resident bleibt (TSR), zum Beispiel
  317. PRINT oder Sidekick, ist eine Rückkehr in das rufende Programm nicht
  318. möglich. Das Programm wird beendet, belegter Speicher in EMS/XMS wird
  319. freigegeben, eine Auslagerungsdatei wird gelöscht.
  320.  
  321. Wenn der Programmspeicher aus mehreren DOS-Speicherblöcken besteht,
  322. benutzt die Auslagerungsfunktion undokumentierte DOS-Interna.
  323. Insbesondere werden Speicherkontrollblöcke direkt modifiziert. Dies
  324. kann theoretisch zu Inkompatibilitäten mit späteren DOS-Versionen,
  325. oder mit DOS-Clones oder Emulatoren führen. Im praktischen Betrieb
  326. wurden bisher noch keine Probleme mit irgendwelchen DOS-Versionen,
  327. einschließlich DOS 5.0 und der DR-DOS Versionen, festgestellt.
  328.  
  329. Wenn NO_INHERIT in spawn.asm gesetzt ist, werden einige
  330. undokumentierte Felder im PSP benutzt und modifiziert. Auch dies
  331. sollte mit allen DOS-Versionen und Clones funktionieren. Sollten Sie
  332. jedoch Probleme befürchten, können Sie NO_INHERIT auf 0 setzen.
  333.  
  334.  
  335.                         Änderungsgeschichte
  336.                         ===================
  337.  
  338. Änderungen von Version 3.0a auf 3.1:
  339.  
  340. Neu sind vor allem die automatische Behandlung von .BAT-Dateien und
  341. die Unterstützung der I/O-Dateiumleitung. Die Suchreihenfolge für
  342. Kommandos entspricht jetzt exakt der DOS-Reihenfolge, bis auf die
  343. Bearbeitung interner Kommandos (es gibt keinen sicheren Weg für die
  344. Erkennung, ob ein Kommando intern oder extern ist). Dateiumleitung
  345. ist optional. Das Interface zu do_exec hat sich nicht geändert,
  346. do_spawn benötigt drei neue Parameter wenn Redirection eingeschaltet
  347. ist.
  348.  
  349. Eine Routine (checkpat.asm) die einen Pfad prüft und auflöst sowie in
  350. seine Bestandteile aufteilt wurde hinzugefügt. Diese Routine führt
  351. einige Prüfungen des Pfades und des Dateinamens durch und behandelt
  352. Critical Errors (ungültiges Laufwerk, Laufwerk nicht bereit) ohne
  353. Benutzereingriff. Die Routine wird zur Bearbeitung des
  354. Programm-Dateinamens, des Kommandoprozessor-Dateinamens und des
  355. temporären Dateipfades verwendet. Die Routine ist unabhängig von den
  356. anderen EXEC/SPAWN-Funktionen, sie kann daher auch in anderen
  357. Applikationen nützlich sein.
  358.  
  359. Einige neue Fehlercodes erlauben eine bessere Analyse von
  360. Fehlerursachen.
  361.  
  362. Der Pfad der temporären Datei ist jetzt stets ein vollständiger Pfad.
  363. Ein Wechsel von Laufwerk oder Pfad während der Auslagerung kann daher
  364. jetzt nicht mehr zum Verlust der Auslagerungsdatei führen.
  365.  
  366. Die Prüfung auf Existenz einer Datei wurde in checkpat.asm verlagert,
  367. und von der 'find first'-Funktion auf 'get file attributes'
  368. umgestellt. Dies scheint geringfügig schneller und vermeidet
  369. Compiler-Abhängigkeiten.
  370.  
  371. Das Programm GETLANG wurde korrigiert, die Hilfs-Meldungen werden
  372. jetzt auf stderr ausgegeben.
  373.  
  374.  
  375. Änderungen von Version 3.0 auf 3.0a:
  376.  
  377. Ein kleiner Fehler in EXEC.C wurde korrigiert: ein '<' fehlte in
  378. einem deutschen Kommentar, sodaß bei GETLANG E ein großer Teil der
  379. Datei verschluckt wurde.
  380.  
  381. Ein Problem (Fehler? Feature?) bei der Turbo C/Borland C "stat"
  382. Funktion, die für Directories stets "read-only" liefern, verhinderte
  383. die Benutzung der TEMP Directory beim Auslagern. Die Schreib-
  384. Erlaubnis wird jetzt nicht mehr geprüft.
  385.  
  386. Die Präallozierung der Auslagerungsdatei, die mit Version 3.0
  387. eingeführt wurde um sicherzustellen daß das Laufwerk den kompletten
  388. Speicher fassen kann, führte zu starken Verzögerungen wenn die
  389. Auslagerungsdatei auf einem Novell-Netzwerk Laufwerk lag. Um dieses
  390. Problem zu umgehen wurden zwei neue Flags für den "method" Parameter
  391. eingeführt:
  392.  
  393.       NO_PREALLOC - Nie Präallozieren
  394.       CHECK_NET   - Nicht Präallozieren wenn Datei auf Netzwerk
  395.  
  396. Wenn die Datei nicht präalloziert wird, wird das Laufwerk nicht auf
  397. ausreichenden Platz geprüft. Die Alternative, der "get disk free
  398. space" Aufruf, dauert im allgemeinen noch wesentlich länger als ein
  399. Präallozieren. Dies ist allerdings kein großes Problem, die
  400. Auslagerung liefert lediglich den Fehlercode 0x502 wenn der
  401. Speicherplatz nicht ausreicht.
  402.  
  403.  
  404. Änderungen für Version 3.0:
  405.  
  406. Dies ist die erste Version mit Deutscher Dokumentation. Falls Sie mit
  407. früheren Versionen gearbeitet haben, können Sie die Änderungen in der
  408. Englischen Beschreibung nachlesen - denn dann können Sie doch
  409. Englisch, oder? :)
  410.